iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0

https://ithelp.ithome.com.tw/upload/images/20230914/20119486WyuzEe3i4b.png

前言

前一篇我們初步對於資料庫有了一點概念後,接下來當然要進入資料庫章節啦~

MongoDB?

什麼是 MongoDB 呢?其實 MongoDB 就是我們前一篇文章所介紹的 NoSQL 資料庫,而且前面也有提到 NoSQL 的資料格式類似於 JSON 格式。

但!!!是!!!!

MongoDB 其實真正的資料格式是 BSON,而不是 JSON,BSON 是 Binary JSON 的縮寫,是一種二進位的表示形式,因此比 JSON 更加節省空間,而且支援更多的資料型態。

舉例來講 JSON 格式只有以下

  • 物件(Object)
  • 陣列(Array)
  • 字串(String)
  • 數字(Number)
  • 布林值(Boolean)
  • 空值(null)

而 BSON 則多了以下

  • 日期(Date)
  • 二進位資料(Binary data)
  • 正規表示式(Regular expression)
  • JavaScript 代碼(JavaScript code)
  • ObjectId
  • 64 位元整數(64-bit integer)
  • 128 位元浮點數(128-bit floating point number)
  • Timestamp

...等等。

因此 BSON 又會被稱為是 JSON 的超集合(superset)。

那麼以上大概就是關於 MongoDB 的重點跟差異,接下來我們就來看看如何使用 MongoDB 吧!

MongoDB Atlas 註冊

這邊我就不說明本地端的 MongoDB 安裝方式,如果你想要在本地端運作的話,我相信你可以在網路上找到的,取而代之,我會以 MongoDB Atlas 來說明。

https://ithelp.ithome.com.tw/upload/images/20230914/20119486FeJd6EDAYV.png

Note
如果你真的找不到本地端的安裝方式的話,你可以參考我先前寫的「(1)被迫吃芒果的前端工程師 - 認識 MongoDB 與安裝 MongoDB」文章;除非有人許願希望我寫一篇本地端安裝的文章,不然我應該不會寫了 XD。

MongoDB Atlas 是什麼呢?MongoDB Atlas 是由 MongoDB 官方所提供的雲端服務,你可以在上面建立一個 MongoDB 的資料庫,並且透過網路連線的方式來存取資料庫,實戰上來講,我們也比較常見將資料庫放在雲端平台上,當然這不會是絕對,還是會以專案需求為主。

這邊請你先點擊以下連結進入 MongoDB 的官網,並且註冊一個帳號。

https://account.mongodb.com/account/login

這邊我會推薦你使用 GitHub 帳號來註冊

https://ithelp.ithome.com.tw/upload/images/20230914/20119486iOBOyspxxx.png

畢竟身為一名工程師,應該都會有 GitHub 帳號吧?

基本上你點了註冊後,應該會出現隱私權政策的頁面,你可以直接點選同意,然後就會進入到以下畫面

https://ithelp.ithome.com.tw/upload/images/20230914/20119486SNov3i5P5c.png

這個畫面會稍微需要等一下,接著你應該會跳出它詢問幾個問題,底下我也提供我的選項給你參考

  • What is your goal today?
    • [x] Learn MongoDB
    • [ ] Explore what I can build
    • [ ] Migrate an existing application
    • [ ] Build a new application
  • What type of application are you building?
    • I'm just exploring
  • What is your preferred language?
    • JavaScript

https://ithelp.ithome.com.tw/upload/images/20230914/20119486ps1uctklE9.png

當然你也可以自己選擇,這邊我只是提供一個參考而已,接著你就會進入到以下畫面,也就是選擇你的方案(當然是選 Free 免費方案)

https://ithelp.ithome.com.tw/upload/images/20230914/2011948697Wc3XPF2E.jpg

接下來你會進入到 Security Quickstart 畫面,在這邊你可以建立一個可以存取資料庫的使用者,這邊我會建立一個叫做 ithelp 的使用者,密碼就讓它隨機產生

https://ithelp.ithome.com.tw/upload/images/20230914/2011948642hbIij17D.jpg

Note
這組帳號密碼請務必保存好,因為之後我們會用到它。

按下建立使用者按鈕後,你應該會跳到「Where would you like to connect from?」區塊,這邊主要是填寫你要從哪裡連線到資料庫,因此我們要選「My Local Environment」

https://ithelp.ithome.com.tw/upload/images/20230914/20119486WG1MoMEMMk.png

接下來是「Add entries to your IP Access List」區塊,底下的 IP Address 跟 Description 幫我依照以下填寫並送出

  • IP Address
    • 0.0.0.0
  • Description
    • All Ips

https://ithelp.ithome.com.tw/upload/images/20230914/20119486ZUhX0Eei0C.jpg

這一段 0.0.0.0 的意思是「全部的 IP 都可以連線到資料庫」,加入後你就可以按下「Finish and Close」按鈕,這樣你就可以進入到資料庫的畫面了

Note
預設 MongoDB 會在你建立資料庫時,自動幫你加入一個你電腦當前 IP 位址;設定為 0.0.0.0 主要是為了方便練習才這樣設定,實戰上並不會這樣做唷。

新增 MongoDB Atlas 資料庫

在 Overview 頁面你可以看到有三種方式可以新增資料

  • Add Data
  • Load Sample Data
  • Data Modeling Templates

https://ithelp.ithome.com.tw/upload/images/20230914/20119486nylnoohq2E.png

那麼為了方便示範,我們就選擇「Load Sample Data」,這樣就會幫你篩入一些範例資料,載入過程會需要一點時間,載入完畢後,你應該會看到 Browse Collections 的按鈕,按下去後你就可以看到資料庫的內容了~

https://ithelp.ithome.com.tw/upload/images/20230914/20119486PBhax7TX4F.png

只要你能看到上面的畫面,那麼我們 MongoDB Atlas 的設定就完成了,接下來我們就可以開始進行連線的設定了~

Mongoose

其實官方有提供一個「MongoDB Compass」的工具,這個工具可以幫你連線到 MongoDB Atlas,不過這邊我並不會介紹這個工具,而是會直接使用 Mongoose 來連線到 MongoDB Atlas。

Note
如果你想自己嘗試使用 MongoDB Compass 的話,你可以參考我這一篇文章「(28)被迫吃芒果的前端工程師 - Atlas - MongoDB Compass 教學」。

首先這邊請你輸入以下指令來建立新專案

mkdir example-mongoose
cd example-mongoose
npm init -y

接著請你安裝以下套件

npm i mongoose

安裝完畢後,我們先暫停一下,先讓我們認識一下 Mongoose 是什麼吧!

Mongoose 是什麼?

簡單來講 Mongoose 是一個 Node.js 的 ODM(Object Data Modeling),它可以幫助我們在 Node.js 中,更方便的操作 MongoDB 資料庫。

「難道不能直接使用 MongoDB 操作嗎?」

答案是可以的,但通常來講我們比較少會直接操作 MongoDB,而是會透過 ODM 來操作,透過 ODM 是可以降低開發與維護的成本,除非你很熟悉 MongoDB,否則會建議你還是使用 ODM。

那麼什麼是 ODM 呢?ODM 全名是 Object-Document Mapping(物件-文件映射),簡單來講就是將資料庫的文件映射到物件上,這樣就可以透過物件的方式來操作資料庫。

Note
另一個則是 ORM - Object-Relational Mapping(物件-關聯映射),這個是用來操作關聯式資料庫的,例如 MySQL、PostgreSQL 等等。

簡單來講 Mongoose 就是幫你整合了 MongoDB 的操作,讓你可以透過一些它封裝好的方法來操作資料庫,這樣就不用自己寫原生的 MongoDB 指令。

連線到 MongoDB Atlas

回到剛剛我們建立的專案(example-mongoose),我們先建立一個 index.js 檔案,並輸入以下程式碼

const mongoose = require('mongoose');

mongoose.connect('mongodb+srv://<帳號>:<密碼>@cluster0.zyfzacs.mongodb.net/?retryWrites=true&w=majority')
  .then(() => console.log('Connected to MongoDB...'))

要注意沒有 <> 符號,因此以範例來講,會長這樣

const mongoose = require('mongoose');

mongoose.connect('mongodb+srv://example:example@cluster0.zyfzacs.mongodb.net/?retryWrites=true&w=majority')
  .then(() => console.log('Connected to MongoDB...'))

你只要把你剛剛在 MongoDB Atlas 建立的使用者帳號與密碼填入即可,填入後你就可以執行以下指令來測試連線

node index.js

當你有看到「Connected to MongoDB...」這個訊息,那麼恭喜你,你已經成功連線到 MongoDB Atlas 了!

ok,這邊其實有一個問題存在,也就是我寫的 mongoose.connect 字串並不適用於你,因為每個人都有連線字串,所以這邊該如何取得呢?請你到原本的 MongoDB Atlas 頁面,點選「Connect」

https://ithelp.ithome.com.tw/upload/images/20230914/20119486KwFsd2i1FU.jpg

然後選擇「Drivers」

https://ithelp.ithome.com.tw/upload/images/20230914/20119486OSJjqW0Z8W.jpg

接下來你滾到下方你就會看到一個連線字串,請你把它複製下來,並貼到 mongoose.connect 中,這樣就可以了~

https://ithelp.ithome.com.tw/upload/images/20230914/20119486wM2CQypHQP.jpg

那麼這一段連線字串是怎樣呢?別擔心,這邊我也來拆解說明一下。

連線字串

以我的範例來講,我的連線字串是長這樣

'mongodb+srv://example:<password>@cluster0.zyfzacs.mongodb.net/?retryWrites=true&w=majority'

其實這個連線字串是由幾個部分組成的,我們來一個一個拆解

  • mongodb+srv://:這是 MongoDB Atlas 的連線字串開頭,mongodb+srv 表示使用 MongoDB 的 SRV 連線格式,如果你使用的是 MongoDB 的舊版連線格式,那麼這邊就會是 mongodb://
  • example:這是你的使用者帳號,請把它替換成你的使用者帳號。
  • <password>:這是你的使用者密碼,請把它替換成你的使用者密碼。
  • cluster0.zyfzacs.mongodb.net:這是你的 MongoDB Atlas 位址,請把它替換成你的 MongoDB Atlas 位址。
  • ?retryWrites=true&w=majority:這是 MongoDB Atlas 的參數;retryWrites=true 意思是說當寫入失敗時,MongoDB Atlas 會自動重試;w=majority 意思是說當寫入成功時,MongoDB Atlas 會等待大部分的資料庫節點都寫入成功後才回應。

因此,當你要連線到 MongoDB Atlas 時,你只要把這幾個部分替換成你的資料即可。

'mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]'

當然 MongoDB 的連線字串還有很多參數,這邊我就不一一介紹了,如果你想要了解更多,可以參考 MongoDB 官方文件

啊,這一篇寫得有一點長了,所以這一篇先到這邊結束好了,我們下一篇見囉~

Note
如果你好奇 MongoDB 的基本操作跟語法的話,可以參考我先前寫的「被迫吃芒果的前端工程師」,後面章節我可能也不會每個語法都特別介紹,所以建議如果你不熟悉的話,可以考慮先閱讀一下。

碎碎念

去年其實就一直想說要寫 Node.js,結果今年要寫的時候就遇上公司的 Node.js 課程開班,結果一路忙到快開賽才準備要寫的內容,然後寫著寫著...怎麼那麼多 RRRRRRR


上一篇
Day9 - What is a database?
下一篇
Day11 - Express 與 Mongoose
系列文
《Node.js 不負責系列:把前端人員當作後端來用,就算是前端也能嘗試寫的後端~原來 Node.js 可以做這麼多事~》31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言